Proyecto Estadistica Actuarial I

Estudiantes

Luis Fernando Amey Apuy - C20470

Anthony Jiménez Navarro - C24067

Javier Hernández Navarro - C13674

Erick Venegas Espinoza - C09319

2024-06-07

Librerías

# install.packages("zoo")
# install.packages("dplyr")
# install.packages("gtsummary")
# install.packages("pastecs")
# install.packages("summarytools")
# install.packages("ggplot2")
# install.packages("corrplot")
# install.packages("ggpubr")
# install.packages('openxlsx')
# install.packages('knitr')
# install.packages("plotly)

library(plotly)
library(ggpubr)
library(zoo)
library(dplyr)
library(readxl)
library(gtsummary)
library(pastecs)
library(summarytools)
library(ggplot2)
library(corrplot)
library(openxlsx)
library(knitr)

Carga de datos

Importación de los datos

# Se carga la base de datos principal
World_Data <- read_excel("data/World_Data.xlsx")

# Se clona
World_Data_2 <- World_Data

# Se carga la base de datos con los indices de felicidad
Tabla_Felicidad <- read_excel("data/DataForTable2.1 (1).xls")

Limpieza de los datos

Resumir la variable de año

Los valores que presenta la tabla de World_Data utiliza promedios que van desde el rango del 2015 al 2018, por lo que para proceder a trabajar Tabla_Felicidad, se hace un promedio de las variables agrupando con los países y se elimina la variable de año. Además, se calcula el promedio y se genera una nueva tabla únicamente con los promedios de las distintas variables

Tabla_Felicidad_2 <- Tabla_Felicidad[
  Tabla_Felicidad$year >= 2015 & Tabla_Felicidad$year <= 2018, 
  ]

Tabla_Felicidad_2 <- Tabla_Felicidad_2 %>%
  group_by(`Country name`) %>%
  summarise(across(where(is.numeric), ~ mean(.x, na.rm = TRUE)))

Tabla_Felicidad_2 <- Tabla_Felicidad_2 %>%
  select(-year)

Eliminar variables repetidas

Se eliminan de World_Data_2 las variables “social_support”, “freedom” y “generosity”, esto con el fin de agregar los promedios obtenidos de Tabla_Felicidad_Reducida.

World_Data_2 <- World_Data_2 %>%
  select(-social_support, -freedom, -generosity)

Mezcla de las dos bases de datos

Se unen los dos dataframes, realizando una comparación entre “country” y “Country name”, ademas se omiten los países que no cuentan con una entrada en Tabla_Felicidad_2

World_Data_3 <- merge(World_Data_2,
                      Tabla_Felicidad_2,
                      by.x = "country",
                      by.y = "Country name")

Limpieza NA

Se decide reemplazar los valores N/A presentes en distintas entradas por el promedio de la variable. Se van a contar los N/A después del procedimiento para asegurar de que no haya ninguno, y además se va a realizar un summary de esta. La existencia de valores N/A es debido a que no todos los países reportan todos los años a las tres entidades de las cuales se obtienen los datos, esto debido a las distintas dinámicas geo-socio-políticas que se desarrollan en las distintas divisiones geográficas del mundo, así como la calidad de las relaciones que existe entre los países, o situaciones de guerra o crisis.

promedios <- sapply(World_Data_3,
                    function(x) if(is.numeric(x)) mean(x, na.rm = TRUE) else NA)
for (col in names(World_Data_3)) {
  World_Data_3[[col]][is.na(World_Data_3[[col]])] <- promedios[[col]]
}
colSums(is.na(World_Data_3))
##                          country               electricity_access 
##                                0                                0 
##                              gdp                       gdp_capita 
##                                0                                0 
##                       labor_rate                      labor_force 
##                                0                                0 
##                        land_area                  life_expectancy 
##                                0                                0 
##                   adult_literacy                     water_access 
##                                0                                0 
##                    air_pollution               population_density 
##                                0                                0 
##                       population              alcohol_consumption 
##                                0                                0 
##                unemployment_rate                     income_class 
##                                0                                0 
##                              cpi                      Life Ladder 
##                                0                                0 
##               Log GDP per capita                   Social support 
##                                0                                0 
## Healthy life expectancy at birth     Freedom to make life choices 
##                                0                                0 
##                       Generosity        Perceptions of corruption 
##                                0                                0 
##                  Positive affect                  Negative affect 
##                                0                                0

Transformación de la columna income_class

En la estructura que presenta “World_Data_3” se puede observar que cada variable va en una columna, no existe una combinación de distintas variables en la misma columna. A su vez cada observación es única y sus valores están distribuidos a lo largo de una única fila. Existe un identificador o key claro para cada una de las entradas, en este caso corresponde a la columna “country” que indica el país. Además queremos que todas las variables manejen valores numéricos, así que se va a reemplazar los valores de “income_class” por su factor, para de esta forma tener únicamente variables numéricas. Ahora lo que vamos a realizar es un análisis descriptivo completo de la tabla, la forma mas sencilla de empezar este proceso es mediante la función “summary()”, la cual permite obtener distintos estadísticos de la tabla en cuestión. Se procede a utilizar dicha función.

World_Data_3 <- World_Data_3 %>%
  mutate(income_class = case_when(
    income_class == "Low income" ~ 0,
    income_class == "Lower middle income" ~ 1,
    income_class == "Upper middle income" ~ 2,
    income_class == "High income" ~ 3
  ))

Haciendo las columnas en formato tidy

colnames(World_Data_3) <- tolower(gsub(" ", "_", colnames(World_Data_3)))

Eliminar la columna país

Además vamos a eliminar la columna de país, ya que queremos conseguir una correlación entre las distintas variables, esta no aporta utilidad en una escala mayor.

Data_trabajar <- subset(World_Data_3, select = -country)

Análisis descriptivo

Resumen

Se obtiene un resumen de la base de datos principal sin modificar por medio de summary()

summary(World_Data)
##    country          electricity_access      gdp              gdp_capita    
##  Length:186         Min.   :  5.15     Min.   :3.624e+08   Min.   :   252  
##  Class :character   1st Qu.: 68.75     1st Qu.:1.149e+10   1st Qu.:  2001  
##  Mode  :character   Median : 99.09     Median :4.016e+10   Median :  5788  
##                     Mean   : 82.27     Mean   :4.312e+11   Mean   : 13634  
##                     3rd Qu.:100.00     3rd Qu.:2.152e+11   3rd Qu.: 17083  
##                     Max.   :100.00     Max.   :1.923e+13   Max.   :109835  
##                     NA's   :1          NA's   :3           NA's   :3       
##    labor_rate     labor_force          land_area        life_expectancy
##  Min.   :32.31   Min.   :    36392   Min.   :     300   Min.   :52.19  
##  1st Qu.:55.27   1st Qu.:  1292307   1st Qu.:   28050   1st Qu.:65.90  
##  Median :60.69   Median :  4145528   Median :  138790   Median :73.42  
##  Mean   :60.71   Mean   : 18327937   Mean   :  699815   Mean   :71.96  
##  3rd Qu.:66.00   3rd Qu.: 12228557   3rd Qu.:  566730   3rd Qu.:77.77  
##  Max.   :87.47   Max.   :779046779   Max.   :16376870   Max.   :84.53  
##  NA's   :4       NA's   :4           NA's   :1                         
##  adult_literacy    water_access    air_pollution    population_density
##  Min.   : 24.16   Min.   : 36.08   Min.   :  0.00   Min.   :   1.97   
##  1st Qu.: 73.22   1st Qu.: 78.12   1st Qu.: 99.46   1st Qu.:  31.36   
##  Median : 91.53   Median : 94.46   Median :100.00   Median :  80.49   
##  Mean   : 82.02   Mean   : 86.88   Mean   : 89.97   Mean   : 230.89   
##  3rd Qu.: 96.84   3rd Qu.: 99.22   3rd Qu.:100.00   3rd Qu.: 187.19   
##  Max.   :100.00   Max.   :100.00   Max.   :100.00   Max.   :7873.79   
##  NA's   :73       NA's   :2        NA's   :3        NA's   :1         
##    population        alcohol_consumption unemployment_rate social_support  
##  Min.   :7.033e+04   Min.   : 0.000      Min.   : 0.143    Min.   :0.3050  
##  1st Qu.:2.660e+06   1st Qu.: 1.751      1st Qu.: 3.731    1st Qu.:0.7300  
##  Median :9.243e+06   Median : 5.096      Median : 5.710    Median :0.8220  
##  Mean   :4.034e+07   Mean   : 5.525      Mean   : 7.614    Mean   :0.7988  
##  3rd Qu.:2.968e+07   3rd Qu.: 8.652      3rd Qu.:10.219    3rd Qu.:0.9010  
##  Max.   :1.392e+09   Max.   :16.852      Max.   :26.186    Max.   :0.9770  
##                      NA's   :6           NA's   :4         NA's   :33      
##     freedom         generosity       income_class            cpi       
##  Min.   :0.4280   Min.   :-0.29100   Length:186         Min.   : 9.25  
##  1st Qu.:0.6930   1st Qu.:-0.11250   Class :character   1st Qu.:28.75  
##  Median :0.7850   Median :-0.01350   Mode  :character   Median :37.75  
##  Mean   :0.7685   Mean   :-0.00131                      Mean   :42.92  
##  3rd Qu.:0.8610   3rd Qu.: 0.09650                      3rd Qu.:56.59  
##  Max.   :0.9800   Max.   : 0.60600                      Max.   :89.25  
##  NA's   :33       NA's   :34                            NA's   :7
summary(Tabla_Felicidad)
##  Country name            year       Life Ladder    Log GDP per capita
##  Length:2363        Min.   :2005   Min.   :1.281   Min.   : 5.527    
##  Class :character   1st Qu.:2011   1st Qu.:4.647   1st Qu.: 8.506    
##  Mode  :character   Median :2015   Median :5.449   Median : 9.503    
##                     Mean   :2015   Mean   :5.484   Mean   : 9.400    
##                     3rd Qu.:2019   3rd Qu.:6.324   3rd Qu.:10.393    
##                     Max.   :2023   Max.   :8.019   Max.   :11.676    
##                                                    NA's   :28        
##  Social support   Healthy life expectancy at birth Freedom to make life choices
##  Min.   :0.2282   Min.   : 6.72                    Min.   :0.2283              
##  1st Qu.:0.7438   1st Qu.:59.20                    1st Qu.:0.6607              
##  Median :0.8344   Median :65.10                    Median :0.7711              
##  Mean   :0.8094   Mean   :63.40                    Mean   :0.7503              
##  3rd Qu.:0.9038   3rd Qu.:68.55                    3rd Qu.:0.8617              
##  Max.   :0.9873   Max.   :74.60                    Max.   :0.9852              
##  NA's   :13       NA's   :63                       NA's   :36                  
##    Generosity       Perceptions of corruption Positive affect 
##  Min.   :-0.33955   Min.   :0.0352            Min.   :0.1789  
##  1st Qu.:-0.11194   1st Qu.:0.6868            1st Qu.:0.5720  
##  Median :-0.02161   Median :0.7985            Median :0.6634  
##  Mean   : 0.00010   Mean   :0.7440            Mean   :0.6519  
##  3rd Qu.: 0.09357   3rd Qu.:0.8676            3rd Qu.:0.7373  
##  Max.   : 0.69957   Max.   :0.9833            Max.   :0.8836  
##  NA's   :81         NA's   :125               NA's   :24      
##  Negative affect  
##  Min.   :0.08274  
##  1st Qu.:0.20856  
##  Median :0.26217  
##  Mean   :0.27316  
##  3rd Qu.:0.32621  
##  Max.   :0.70459  
##  NA's   :16

Se guarda el desc brevemente de la base de datos conjunta

write.xlsx(descr(World_Data_3),
           "docs/Estadisticas_Descriptivas.xlsx", rowNames = TRUE)

Y un summary breve después de la modificación de la base de datos

summary(Data_trabajar)
##  electricity_access      gdp              gdp_capita       labor_rate   
##  Min.   :  5.15     Min.   :1.061e+09   Min.   :   252   Min.   :34.18  
##  1st Qu.: 75.87     1st Qu.:1.475e+10   1st Qu.:  1588   1st Qu.:55.27  
##  Median : 99.53     Median :5.492e+10   Median :  5317   Median :60.67  
##  Mean   : 82.99     Mean   :5.199e+11   Mean   : 14343   Mean   :60.60  
##  3rd Qu.:100.00     3rd Qu.:3.163e+11   3rd Qu.: 16579   3rd Qu.:65.85  
##  Max.   :100.00     Max.   :1.923e+13   Max.   :109835   Max.   :87.47  
##   labor_force          land_area        life_expectancy adult_literacy 
##  Min.   :   202458   Min.   :     300   Min.   :52.19   Min.   :24.16  
##  1st Qu.:  2086254   1st Qu.:   54784   1st Qu.:65.83   1st Qu.:80.70  
##  Median :  4774402   Median :  215262   Median :73.71   Median :80.70  
##  Mean   : 21850738   Mean   :  831735   Mean   :72.20   Mean   :80.70  
##  3rd Qu.: 13191711   3rd Qu.:  647155   3rd Qu.:78.89   3rd Qu.:94.14  
##  Max.   :779046779   Max.   :16376870   Max.   :84.02   Max.   :99.99  
##   water_access    air_pollution    population_density   population       
##  Min.   : 40.77   Min.   :  0.00   Min.   :   1.97    Min.   :3.406e+05  
##  1st Qu.: 80.48   1st Qu.: 97.54   1st Qu.:  34.71    1st Qu.:4.753e+06  
##  Median : 94.14   Median :100.00   Median :  81.35    Median :1.095e+07  
##  Mean   : 87.40   Mean   : 88.81   Mean   : 211.49    Mean   :4.863e+07  
##  3rd Qu.: 99.31   3rd Qu.:100.00   3rd Qu.: 177.62    3rd Qu.:3.341e+07  
##  Max.   :100.00   Max.   :100.00   Max.   :7873.79    Max.   :1.392e+09  
##  alcohol_consumption unemployment_rate  income_class       cpi       
##  Min.   : 0.000      Min.   : 0.143    Min.   :0.00   Min.   : 9.25  
##  1st Qu.: 1.898      1st Qu.: 3.885    1st Qu.:1.00   1st Qu.:29.50  
##  Median : 5.285      Median : 5.561    Median :2.00   Median :37.50  
##  Mean   : 5.711      Mean   : 7.415    Mean   :1.74   Mean   :43.36  
##  3rd Qu.: 9.422      3rd Qu.: 9.607    3rd Qu.:3.00   3rd Qu.:56.62  
##  Max.   :16.852      Max.   :23.775    Max.   :3.00   Max.   :89.25  
##   life_ladder    log_gdp_per_capita social_support  
##  Min.   :3.084   Min.   : 6.607     Min.   :0.3049  
##  1st Qu.:4.512   1st Qu.: 8.481     1st Qu.:0.7345  
##  Median :5.379   Median : 9.491     Median :0.8267  
##  Mean   :5.402   Mean   : 9.355     Mean   :0.8026  
##  3rd Qu.:6.172   3rd Qu.:10.286     3rd Qu.:0.9053  
##  Max.   :7.689   Max.   :11.650     Max.   :0.9773  
##  healthy_life_expectancy_at_birth freedom_to_make_life_choices
##  Min.   :42.58                    Min.   :0.4280              
##  1st Qu.:58.67                    1st Qu.:0.7042              
##  Median :64.90                    Median :0.7886              
##  Mean   :63.30                    Mean   :0.7723              
##  3rd Qu.:68.40                    3rd Qu.:0.8622              
##  Max.   :73.79                    Max.   :0.9797              
##    generosity        perceptions_of_corruption positive_affect 
##  Min.   :-0.294147   Min.   :0.1012            Min.   :0.3630  
##  1st Qu.:-0.110701   1st Qu.:0.6930            1st Qu.:0.5818  
##  Median :-0.020626   Median :0.7822            Median :0.6792  
##  Mean   :-0.003002   Mean   :0.7346            Mean   :0.6588  
##  3rd Qu.: 0.085332   3rd Qu.:0.8496            3rd Qu.:0.7326  
##  Max.   : 0.628862   Max.   :0.9419            Max.   :0.8284  
##  negative_affect 
##  Min.   :0.1347  
##  1st Qu.:0.2210  
##  Median :0.2847  
##  Mean   :0.2891  
##  3rd Qu.:0.3361  
##  Max.   :0.6426

Correlaciones

Con la data estructurada de la forma adecuada, podemos empezamos a buscar la relación existente entre los distintos marcadores con respecto a nuestro variable objetivo, en este caso “life_ladder”. De la matriz de covarianza, podemos encontrar que tanta relación existe entre las distintas variables que forman la tabla, de forma que va a ser mas sencillo visualizar en que variables concentrar el estudio. Así como la de correlación, ya que al estar normalizada con valores que van desde -1 hasta 1, resulta mas sencilla observar las relaciones existentes. También se imprime el plot de correlaciones, ya que las dimensiones de Látex limitan la posibilidad de utilizar la matriz numérica.

## png 
##   2

Selección de variables relevantes

Ahora que tenemos el plot de correlación, seleccionamos las variables relevantes para el estudio, así que creamos un nuevo dataframe únicamente con las variables importantes, entre las que más se relacionan.

Data_relevante = Data_trabajar %>% select (life_ladder,
                                           electricity_access,
                                           water_access, 
                                           income_class,
                                           cpi,
                                           log_gdp_per_capita)

Descripción de variables relevantes

Vamos a realizar varios estadísticos breves para las variables de importancia

life_ladder_table <- data.frame(
  Valor = c(summary(Data_relevante$life_ladder),
            sd(Data_trabajar$life_ladder))
)
row.names(life_ladder_table) <- c("Mínimo",
                                  "1° Cuartil",
                                  "Mediana",
                                  "Media",
                                  "3° Cuartil",
                                  "Máximo",
                                  "Desviación Estándar")
print(life_ladder_table)
##                        Valor
## Mínimo              3.084462
## 1° Cuartil          4.511908
## Mediana             5.378752
## Media               5.402009
## 3° Cuartil          6.172230
## Máximo              7.688532
## Desviación Estándar 1.121033
log_gdp_table <- data.frame(
  Valor = c(summary(Data_relevante$log_gdp_per_capita),
            sd(Data_trabajar$log_gdp_per_capita))
)
row.names(log_gdp_table) <- c("Mínimo",
                              "1° Cuartil",
                              "Mediana",
                              "Media",
                              "3° Cuartil",
                              "Máximo",
                              "Desviación Estándar")
print(log_gdp_table)
##                         Valor
## Mínimo               6.607256
## 1° Cuartil           8.481271
## Mediana              9.491440
## Media                9.355073
## 3° Cuartil          10.286450
## Máximo              11.649626
## Desviación Estándar  1.204099

Y las guardamos

write.xlsx(life_ladder_table, "docs/life_ladder_table.xlsx", rowNames = TRUE)
write.xlsx(log_gdp_table, "docs/log_gdp_table.xlsx", rowNames = TRUE)

Ajuste completo del modelo

Coeficiente de Correlación de Pearson

Se van a desarrollar gráficos con el fin de estudiar el comportamiento de los datos selectos, además se agrega el coeficiente de correlación de Pearson para tener claro el nivel de relación existente entre las variables, además se calcula el valor-p el cual nos permite realizar pruebas de hipótesis, en este caso establecer una correlación, en caso de ser menor al usual 0.05 aceptamos la correlación obtenida.

Con valores de p inferiores al 0.05 en todos los casos se acepta la hipótesis de que existe una correlación positiva entre los distintos marcadores del progreso socioeconómico (1) log_gdp_per_capita, (2) electricity_access, (3) water_access, (4) cpi, con respecto a la variable de estudio life_ladder

Correlaciones y Shapiro test

Métodos de Pearson, Kendall y Spearman

Obtenemos la correlación utilizando distintos métodos, en este caso Pearson, Kendall y Spearman, vamos a concentrarnos en Pearson, pero los otros métodos nos permite tener una idea mas clara del comportamiento de los datos.

res <- cor.test(Data_relevante$log_gdp_per_capita,
                Data_relevante$life_ladder,
                method=c("pearson", "kendall", "spearman"))
print(paste("Valor-p: ",res$p.value))
## [1] "Valor-p:  4.71548398573945e-35"
print(paste("correlación:", res$estimate))
## [1] "correlación: 0.809060910646787"

Prueba de normalidad Shapiro-Wilk de las variables

shapiro.test(Data_relevante$life_ladder) 
## 
##  Shapiro-Wilk normality test
## 
## data:  Data_relevante$life_ladder
## W = 0.98235, p-value = 0.05742
shapiro.test(Data_relevante$log_gdp_per_capita)
## 
##  Shapiro-Wilk normality test
## 
## data:  Data_relevante$log_gdp_per_capita
## W = 0.96765, p-value = 0.001597

Gráficos relevantes a la prueba anterior

qqplots_a <- ggqqplot(Data_relevante$life_ladder, 
                      ylab = "life_ladder") +
  labs(title = "Gráfico de cuantiles de life_ladder") +
  theme_minimal() +
  ylim(0, 10) +
  geom_qq(colour = "mediumseagreen")

qqplots_b <- ggqqplot(Data_relevante$log_gdp_per_capita, 
                      ylab = "life_ladder") +
  labs(title = "Gráfico de cuantiles de log_gdp_per_capita") +
  theme_minimal() +
  ylim(0, 15) +
  geom_qq(colour = "#006400")

# A nivel interactivo, plotly ayuda al html. No sirve para el documento formal.

qqplots_a %>% ggplotly()
qqplots_b %>% ggplotly()
ggsave("docs/terceros_graficos/qqp_life.pdf", plot = qqplots_a, limitsize = FALSE)
## Saving 8 x 5 in image
ggsave("docs/terceros_graficos/qqp_lgdp.pdf", plot = qqplots_b, limitsize = FALSE)
## Saving 8 x 5 in image

En los gráficos se puede apreciar la forma en la que se distribuye las distribuciones y su relación con una distribución normal

Método Delta Multivariable y Transformación Z de Fisher

Para cada uno de los predictores siguientes se decide realizar el calculo de la covarianza y varianzas requeridas para obtener la correlación, además de esto se obtiene el coeficiente de regresión. Seguido de esto se realiza la transformación Z de Fisher para calcular los intervalos de confianza de la correlación obtenida.

Función a aplicar a todas las variables

relacionar <- function(var){
  Y <- Data_relevante$life_ladder
  X <- Data_relevante[[var]]
  XY <- X*Y
  X_2 <- X*X
  n <- length(Data_relevante$life_ladder)
  
  # Covarianza y varianzas
  valor_cov <- cov(X, Y)
  var_X <- var(X)
  var_Y <- var(Y)
  
  # Correlación
  cor = valor_cov/(sqrt(var_X * var_Y))
  
  # Promedios
  XY_promedio <- mean(XY)
  X_promedio <- mean(X)
  Y_promedio <- mean(Y)
  X_2_promedio <- mean(X_2)
  
  rn <- (XY_promedio - X_promedio * Y_promedio) / (sqrt(X_2_promedio - X_promedio^2))
  
  # Función g, del método delta
  funcion_g <- tan(cor)
  funcion_g_prima <- 1/(1-cor^2)
  
  # TLC
  tlc <- sqrt(n) * (rn - cor) * funcion_g_prima
  
  # Transformación de Fisher
  z = funcion_g
  sd_z <- 1 / sqrt(n - 3)
  
  z_conf_int <- z + c(-1, 1) * qnorm(0.975, mean = 0, sd = 1) * sd_z
  cor_conf_int <- (exp(2 * z_conf_int) - 1) / (exp(2 * z_conf_int) + 1)
  
  tabla <- data.frame(
    "Predictor" = var,
    "Correlación" = cor,
    "Coeficiente de Regresión" = rn,
    "IC Inferior Correlación" = cor_conf_int[1],
    "IC Superior Correlación" = cor_conf_int[2]
  )
  return(tabla)
}

Realizando la tabla de resultados

Tabla_Resultados <- rbind(
  relacionar("log_gdp_per_capita"),
  relacionar("electricity_access"),
  relacionar("water_access"),
  relacionar("cpi")
)
print(Tabla_Resultados)
##            Predictor Correlación Coeficiente.de.Regresión
## 1 log_gdp_per_capita   0.8090609                0.9038724
## 2 electricity_access   0.6689585                0.7473518
## 3       water_access   0.7063771                0.7891554
## 4                cpi   0.7184491                0.8026421
##   IC.Inferior.Correlación IC.Superior.Correlación
## 1               0.7087070               0.8373926
## 2               0.5557480               0.7417959
## 3               0.5975631               0.7687028
## 4               0.6109447               0.7771874

Se crea una tabla de resultados con el fin de poder analizar los resultados obtenidas de forma sencilla y agrupada, se puede observar que los coeficientes de correlación presentan un alto grado de relación con respecto a la variable de estudio, además de encontrarse presentes en el rango del Intervalo de Confianza. Lo que se quería demostrar era la relación existente entre los marcadores socio-económicos y el indice de Felicidad, con los resultados obtenidos podemos afirmar que existe una relación positiva.

Análisis de diagnósticos del Modelo

Residuales

Se crea un modelo de regresión lineal entra las variables predictoras y la predecida con el fin de obtener los residuales y evaluar la efectividad del método Shapiro-Wilks

modelo_gdp <- lm(life_ladder ~ log_gdp_per_capita, data = Data_relevante)
modelo_electricity <- lm(life_ladder ~ electricity_access, data = Data_relevante)
modelo_water <- lm(life_ladder ~ water_access, data = Data_relevante)
modelo_cpi <- lm(life_ladder ~ cpi, data = Data_relevante)

Los gráficos nos permiten estudiar el comportamiento de distintos parámetros de los modelos:

  1. Residuals vs Fitted: Nos permite detectar problemas de no linealidad, heterocedasticidad o outliers

  2. Normal Q-Q: Permite evaluar la normalidad de los residuales

  3. Scale-Location: Verifica la homocedasticidad

  4. Residuals vs Leverage: Identifica puntos influyentes

par(mfrow = c(2, 2))
plot(modelo_gdp)

plot(modelo_electricity)

plot(modelo_water)

plot(modelo_cpi)

A su vez el test de normalidad de Shapiro-Wilk de los residuos nos permite observar si se da un comportamiento Normal de los residuos.

shapiro.test(resid(modelo_gdp))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo_gdp)
## W = 0.98599, p-value = 0.1461
shapiro.test(resid(modelo_electricity))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo_electricity)
## W = 0.99002, p-value = 0.3875
shapiro.test(resid(modelo_water))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo_water)
## W = 0.99235, p-value = 0.6237
shapiro.test(resid(modelo_cpi))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo_cpi)
## W = 0.98324, p-value = 0.07216

Normalización

Vamos a normalizar el comportamiento de la variable life_ladder, mediante el uso del Teorema del Límite Central

Y <- Data_relevante$life_ladder
ystd <- data.frame(norm = (Y - mean(Y))/sd(Y))

std <- ggplot(ystd, aes(x = norm)) +
  geom_histogram(aes(y = after_stat(density), fill = "Histograma"), 
                 color = "black", bins = 30) +
  geom_density(aes(fill = "Densidad"), 
               color = "royalblue", 
               alpha = 0.4) +
  geom_function(fun = dnorm,
                aes(color = "Normal(0,1)"),
                linewidth = 1.5,
                alpha = 0.5) + 
  labs(title = "Histograma de life_ladder estandarizada ",
       x = "Valores", 
       y = "Densidad",
       color = " ",
       fill = " ") +
  scale_fill_manual(values = c("blue", "lightblue")) +
  scale_color_manual(values = c("darkorange3")) +
  xlim(-3,3) +
  theme_minimal() + 
  theme(legend.position = 'bottom') 
std %>% ggplotly()